"""
函数相关
1.函数的引用
2.函数的变量作用域（局部和全局变量）
3.**参数与返回值
4.递归
5.内置模块：

"""
from Cython.Utility.MemoryView import direct_copy


# 1.函数的引用 2
def show():
    print("111")
show()  # 方式一，直接调用
splay = show  # 方式二，函数的引用
splay()

# 2.函数的变量作用域（局部和全局变量）
x = 20
def ceshi():
    global x
    x = 10
    print(x)

ceshi()
print(x) #10 10

"""
3.参数与返回值
    1. 位置参数
    2.关键字参数
    3.缺省参数（定义默认值）
    4.不定长参数- 位置传递（*args） 或者 关键字（**kargs）
    5.补充：函数作为参数传递（高阶函数）

"""

# 1. 位置参数，传参的位置对应上； 多重返回值
def ceshi1(name,messsge="缺省参数定义默认值"):
    return name,messsge

resname1,message1 = ceshi1("majialu")
resname2,message2 = ceshi1("巫明瑾","小可爱")
print(resname1,message1)
print(resname2,message2)

# 2.关键字参数（键=值 的形式；没有固定顺序；和位置参数混合使用的时候，位置参数必须在关键字参数前面）

resname3,message3 = ceshi1(name="majialu",messsge="小可爱")
resname4,message4 = ceshi1("majialu",messsge="小可爱")
print(resname3,message3)
print(resname4,message4)

# 3.缺省参数（定义默认值）
# resname1,message1 = ceshi1("majialu")

# 4.不定长参数- 位置传递（*args） 或者 关键字（**kargs）
def ceshi2(*args):
    return args
res1 = ceshi2(10,"majialu")
print(res1) # (10, 'majialu')

def ceshi3(**kwargs):
    return kwargs
res2 = ceshi3(name="majialu",age=10)
print(res2)  # {'name': 'majialu', 'age': 10}

# 5.简单的高阶函数
    # 定义一个函数用于加法运算
def add(x, y):
    return x + y

# 定义高阶函数，接受一个函数和两个数值作为参数
def apply_operation(func, x, y):
    return func(x, y)

# 调用高阶函数，传入 add 函数
result1 = apply_operation(add, 3, 4)
print("加法结果:", result1)




# 函数的嵌套 一个函数a内调用函数b函数
#     函数作为参数传递

# 定义一个列表，每个元素是一个元组
students = [('Alice', 20), ('Bob', 18), ('Charlie', 22)]

# 定义一个函数，用于获取元组的第二个元素
def get_age(student):
    print(student)
    return student[1]

# 使用 sorted 函数，传入 get_age 函数作为 key 参数
sorted_students = sorted(students, key=get_age)
print("按年龄排序后的学生列表:", sorted_students)

"""
4.递归
自己调用自己；在有限的次数内结束；
1.阶乘
2.斐波那契数列 - 兔子数列
"""
# 1.阶乘 f(n) = n*f(n-1)
def f(n):
    if n == 0 or n==1:
        return 1
    return n*f(n-1)

res = f(1)
print(res)
# 2.斐波那契数列 - 兔子数列(第n个数就是前两个数之和)
# 1 1 2 3 5 8 13 21 34 ...
def fib(n):
    if n <= 1:
        return n
    else:
        fib(n-1) + fib(n-2)

res_fib = f(3)
print(res_fib)


"""
5.内置模块：
1.random
2.sys 系统的简写
3. os 与操作系统交互的函数（文件和目录操作；环境变量的访问；进程管理）
4.日志模块 **
"""
#1. random
import random
fruits = ("苹果","香蕉","樱桃")
list1 = [1,2,3,4,5]

rest = random.random() # [0,1)随机的浮点数
rest1 = random.randint(1,10)  #[1,10]的随机整数
rest2 = random.uniform(1,10)  #[1,10]的随机浮点数
rest3 = random.choices(fruits)    #**从序列中随机选一个，返回的都是列表
random.shuffle(list1)  # **随机打乱列表顺序
print(list1)


# 2. sys
import sys
print(sys.argv)
print(sys.path)
print(sys.getdefaultencoding())
print(sys.version_info)
# sys.exit()
print("11111")  # 上面sys.exit()运行推出后，这行不再执行


# 3.os
import os
diretory = os.getcwd()
print(diretory)

# 4.日志-待补充





